/**
 * TODO COSA FA ? COME SI USA?
 */
BootApplication.service('ActiveFilterService', ['$http', '$q', 'configuration', 'log','$rootScope', "readerMenu",'$location','$timeout',
                      function readerMenuFactory($http,   $q,   config,          log,  $rootScope,   readerMenu,  $location,  $timeout){
	
	var that = this;
	var filtriAttivi 		= [];
	var filtriCaricati		= [];
	var filtriPreferiti		= [];
	
	/**
	 * Questo metodo setta a false tutti i campi selected della lista filtri caricati
	 **/
	this.deselectAll = function(){
		angular.forEach(filtriCaricati, function(valueFC, key) {
			if(valueFC.items != undefined)
				angular.forEach(valueFC.items, function(valueSFC, key) {
					valueSFC.selected=false;
				});	
		});
	}
	
	/**
	 * Questo metodo mi permette di impostare come filtri attivi la combinazione salvata nei preferiti
	 **/
	this.setPreferito = function(_idUser, list){
		var filter = $q.defer();
		this.deselectAll();
		angular.forEach(list, function(valueP, key) {
			angular.forEach(filtriCaricati, function(valueFC, key) {
				if(valueFC.items != undefined)
					angular.forEach(valueFC.items, function(valueSFC, key) {
						if(valueSFC.id == valueP.id) {
							valueSFC.selected=true;
						}
					});	
			});
		});
		this.getFiltriAttivi( _idUser ).then(function(data){
			filtriAttivi = data;
		});
		filter.resolve(filtriAttivi);
		return filter.promise;
	}
	/**
	 * Aggiunge ai preferiti tutti i filtri in quel momento selezionati
	 * i filtri selezionati li vado a recuperare direttamente dalla lista dei filtri attivi
	 **/
	this.aggiungiAPreferiti = function( _idUser ){
		var filter = $q.defer();
		var newFiltriP 		= new Object();
		newFiltriP.nome 	= "Preferito";
		newFiltriP.items 	= filtriAttivi
		
		/*Modifico la parte SERVER*/
		readerMenu.saveMenuPreferito(newFiltriP, _idUser).then(function(data){
			/*Modifico la parte WEB*/
			newFiltriP.id = data.data.aaData.id;
			filtriPreferiti.push(angular.copy(newFiltriP));	
		});
		
		filter.resolve(filtriPreferiti);
		return filter.promise;
	}
	/**
	 * Questo metodo mi permette di eliminare il filtro dall'elenco dei filtri preferito
	 **/
	this.delToPreferito = function( _id, _idUser){
		var filter = $q.defer();
		
		/*Modifico la parte SERVER*/
		readerMenu.deleteMenuPreferito(_id, _idUser).then(function(data){
			/*Modifico la parte WEB*/
			angular.forEach(filtriPreferiti, function(valueFP, key) {
				if (valueFP.id == _id )
					filtriPreferiti.splice(key,1);		
			});			
		});

		return filter.promise;
	}
	
	/**
	 * Questo metodo mi restituisce tutti i filtri
	 **/
	this.getFiltri = function( _idUser) {
		filter = $q.defer();
		readerMenu.getMenuActive( _idUser ).then(function(data){
			if (data!=undefined && data.aaData!=undefined) {
				filtriCaricati = data.aaData;
				filter.resolve(filtriCaricati);
			}
		})
		return filter.promise;
	}
	
	/**
	 * Questo metodo mi rfestituisce tutti i menu preferiti salvati da un utente
	 **/
	this.getFiltriPreferiti = function( _idUser ) {
		filterP = $q.defer();
		readerMenu.getMenuPreferiti( _idUser ).then(function(data){
			if (data!=undefined && data.aaData!=undefined) {
				filtriPreferiti = data.aaData;
				filterP.resolve(filtriPreferiti);
			}
		})
		return filterP.promise;
	}

	/**
	 * Questo metodo mi permette di cambiare con toggle lo stato di un filtro da attivo a disattivo
	 **/
	this.changeStatus = function( _idUser, _id ) {
		var filter = $q.defer();
		angular.forEach(filtriCaricati, function(valueFC, key) {
			if(valueFC.items != undefined)
				angular.forEach(valueFC.items, function(valueSFC, key) {
					if(valueSFC.id == _id) 
						valueSFC.selected=!valueSFC.selected;
				});	
		});
		this.getFiltriAttivi( _idUser ).then(function(data){
			filtriAttivi = data;
		});
		return filter.promise;
	}
	
	/**
	 * Questo metodo aggiorna la lista dei filtri attivi valutando il campo selected
	 **/
	this.getFiltriAttivi = function( _idUser ) {
		var filter = $q.defer();
		filtriAttivi.splice(0,filtriAttivi.length);
		angular.forEach(filtriCaricati, function(valueFC, key) {
			if(valueFC.items != undefined)
				angular.forEach(valueFC.items, function(valueSFC, key) {
					if(valueSFC.selected == true) {
						filtriAttivi.push(valueSFC);
					}
				});	
		});
		filter.resolve(filtriAttivi);
		return filter.promise;
	}
}]);
